package com.own.business.system.account.business.service;

import com.own.business.system.account.common.base.BaseAccountType;
import com.own.business.system.account.entity.SystemAccount;

/**
 * SystemAccountService
 *
 * @author chenxueli
 * @date 2022-09-10 16:09:00
 */
public interface SystemAccountService {

    /**
     * 登录
     *
     * @param account     账号信息
     * @param type        账号类型
     * @param accountType 账号类型 1=普通用户 2=管理员
     * @return 登录的用户id信息
     */
    Long login(String account, BaseAccountType type, int accountType);

    /**
     * 登录
     *
     * @param account     账号信息
     * @param password    密码（未加密的密码）
     * @param type        账号类型
     * @param accountType 账号类型 1=普通用户 2=管理员
     * @return 登录的用户id信息
     */
    Long login(String account, String password, BaseAccountType type, int accountType);

    /**
     * 查询账号信息
     *
     * @param account     账号信息
     * @param type        账号类型
     * @param accountType 账号类型 1=普通用户 2=管理员
     * @return 账号信息
     */
    SystemAccount get(String account, BaseAccountType type, int accountType);

    /**
     * 查询账号信息
     *
     * @param userId 用户id
     * @param type   账号类型
     * @return 账号信息
     */
    SystemAccount get(Long userId, BaseAccountType type);

    /**
     * 保存账号信息
     *
     * @param account     账号信息
     * @param type        账号类型
     * @param userId      用户id
     * @param accountType 账号类型 1=普通用户 2=管理员
     * @return 是否注册成功
     */
    default boolean save(String account, BaseAccountType type, int accountType, Long userId) {
        return save(account, null, type, accountType, userId);
    }

    /**
     * 注册账号信息
     *
     * @param account     账号信息
     * @param password    密码（未加密的密码）
     * @param type        账号类型
     * @param userId      用户id
     * @param accountType 账号类型 1=普通用户 2=管理员
     * @return 是否注册成功
     */
    boolean save(String account, String password, BaseAccountType type, int accountType, Long userId);

    /**
     * 修改账号绑定的用户
     *
     * @param account     账号信息
     * @param type        账号类型
     * @param userId      用户id
     * @param accountType 账号类型 1=普通用户 2=管理员
     * @return 是否修改成功
     */
    boolean change(String account, BaseAccountType type, int accountType, Long userId);

    /**
     * 修改账号的密码
     *
     * @param id       账号主键id
     * @param password 密码（未加密的密码）
     * @return 是否修改成功
     */
    boolean changePassword(Long id, String password);

    /**
     * 当前类型是否拥有密码
     *
     * @param userId 用户id
     * @param type   账号类型
     * @return 是否拥有密码
     */
    boolean hasPassword(Long userId, BaseAccountType type);

    /**
     * 设置账号的可用状态
     *
     * @param account     账号信息
     * @param type        账号类型
     * @param accountType 1=普通用户 2=管理员
     */
    void enable(String account, BaseAccountType type, int accountType);

    /**
     * 设置账号的可用状态
     *
     * @param userId 用户id
     * @param type   账号类型
     */
    void enable(Long userId, BaseAccountType type);

    /**
     * 删除账号信息
     *
     * @param account     账号信息
     * @param type        账号类型
     * @param accountType 1=普通用户 2=管理员
     * @return 是否删除成功
     */
    boolean remove(String account, BaseAccountType type, int accountType);

    /**
     * 删除账号信息
     *
     * @param userId 用户id
     * @param type   账号类型
     * @return 是否删除成功
     */
    boolean remove(Long userId, BaseAccountType type);

    /**
     * 删除账号信息
     *
     * @param userId  用户id
     * @param account 账号信息
     * @param type    账号类型
     * @return 是否删除成功
     */
    boolean remove(Long userId, String account, BaseAccountType type);

    /**
     * 统计账号数量
     *
     * @param userId 用户id
     * @return 账号数量
     */
    long count(Long userId);

    /**
     * 注销账号信息
     *
     * @param userId 用户id
     * @param reason 注销原因
     */
    void logout(Long userId, String reason);

}
